import app from "@/constants/app";  // 导入应用程序的常量配置
import { IHttpResponse, IObject } from "@/types/interface";  // 导入接口类型定义
import router from "@/router";  // 导入路由器
import axios, { AxiosRequestConfig } from "axios";  // 导入axios及其类型定义
import qs from "qs";  // 导入qs模块，用于处理查询字符串
import { getToken } from "./cache";  // 导入获取token的函数
import { getValueByKeys } from "./utils";  // 导入获取对象值的函数
import { ElMessage } from "element-plus";  // 导入Element Plus的消息组件

// 创建axios实例
const http = axios.create({
  baseURL: app.api,  // 设置请求的基础URL
  timeout: app.requestTimeout  // 设置请求超时时间
});

// 请求拦截器
http.interceptors.request.use(
  function (config: any) {
    config.headers["X-Requested-With"] = "XMLHttpRequest";  // 设置请求头标识为XMLHttpRequest
    config.headers["Request-Start"] = new Date().getTime();  // 设置请求开始时间
    const token = getToken();  // 获取token
    if (token) {
      config.headers["token"] = token;  // 若存在token，设置请求头token
    }
    if (config.method?.toUpperCase() === "GET") {
      config.params = { ...config.params, _t: new Date().getTime() };  // 对GET请求添加随机参数_t，防止缓存影响
    }
    if (Object.values(config.headers).includes("application/x-www-form-urlencoded")) {
      config.data = qs.stringify(config.data);  // 若请求头包含x-www-form-urlencoded，转换请求数据为URL编码形式
    }
    return config;  // 返回处理后的config对象
  },
  function (error) {
    return Promise.reject(error);  // 请求拦截错误处理
  }
);

// 响应拦截器
http.interceptors.response.use(
  (response) => {
    // 响应成功
    if (response.data.code === 0) {
      return response;  // 返回响应数据
    }

    // 错误提示
    ElMessage.error(response.data.msg);  // 使用Element Plus消息组件显示错误消息

    if (response.data.code === 401) {
      // 自定义业务状态码
      redirectLogin();  // 调用重定向登录页面函数
    }

    return Promise.reject(new Error(response.data.msg || "Error"));  // 返回Promise拒绝状态
  },
  (error) => {
    const status = getValueByKeys(error, "response.status", 500);  // 获取HTTP状态码，默认为500
    const httpCodeLabel: IObject<string> = {
      400: "请求参数错误",
      401: "未授权，请登录",
      403: "拒绝访问",
      404: `请求地址出错: ${getValueByKeys(error, "response.config.url", "")}`,
      408: "请求超时",
      500: "API接口报500错误",
      501: "服务未实现",
      502: "网关错误",
      503: "服务不可用",
      504: "网关超时",
      505: "HTTP版本不受支持"
    };
    if (error && error.response) {
      console.error("请求错误", error.response.data);  // 打印请求错误信息
    }
    if (status === 401) {
      redirectLogin();  // 若状态码为401，调用重定向登录页面函数
    }
    return Promise.reject(new Error(httpCodeLabel[status] || "接口错误"));  // 返回Promise拒绝状态
  }
);

// 重定向登录页面函数
const redirectLogin = () => {
  router.replace("/login");  // 使用路由器重定向到登录页面
  return;  // 返回空
};

// 导出默认函数，用于发起HTTP请求
export default (o: AxiosRequestConfig): Promise<IHttpResponse> => {
  return new Promise((resolve, reject) => {
    http(o)
      .then((res) => {
        return resolve(res.data);  // 解析成功响应数据
      })
      .catch(reject);  // 捕获并拒绝Promise
  });
};